﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using JX.Core;
using JX.Core.Entity;
using JX.Infrastructure;
using JX.Infrastructure.Field;

namespace JX.Application
{
	/// <summary>
	/// 模型管理服务层接口
	/// </summary>
	public partial interface IModelsServiceAppDapper : IServiceAppDapper<ModelsEntity>
	{
		#region 是否存在数据
		/// <summary>
		/// 判断模型名是否存在
		/// </summary>
		/// <param name="modelName"></param>
		/// <returns></returns>
		bool ModelNameExists(string modelName);
		/// <summary>
		/// 判断模型的表名是否存在 
		/// </summary>
		/// <param name="tableName"></param>
		/// <returns></returns>
		bool TableNameExists(string tableName);
		#endregion

		#region 得到实体类
		/// <summary>
		/// 从缓存中得到指定模型ID的模型
		/// </summary>
		/// <param name="modelId"></param>
		/// <returns></returns>
		ModelsEntity GetCacheModelById(int modelId);
		/// <summary>
		/// 从缓存中获取指定表名的模型
		/// </summary>
		/// <param name="tableName"></param>
		/// <returns></returns>
		ModelsEntity GetCacheModelByTableName(string tableName);
		/// <summary>
		/// 根据模型类型取得对应的第一条模型信息
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		ModelsEntity GetModelByModelType(ModelType modelType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		#endregion

		#region 得到实体类列表
		/// <summary>
		/// 获取缓存中的模型列表。
		/// 1、从缓存中得到模型列表。
		/// 2、如果缓存中不存在，则从数据库中得到，并添加到缓存中。
		/// </summary>
		/// <returns></returns>
		IList<ModelsEntity> GetCacheModelList();
		/// <summary>
		/// 获取缓存的内容模型列表
		/// </summary>
		/// <param name="isContent">true：内容模型；false：商品模型；</param>
		/// <returns></returns>
		IList<ModelsEntity> GetCacheModelByIsContent(bool isContent);
		/// <summary>
		/// 获取节点对应的模型缓存列表
		/// </summary>
		/// <param name="nodeId"></param>
		/// <returns></returns>
		IList<ModelsEntity> GetCacheModelByNodeId(int nodeId);
		/// <summary>
		/// 获取模型列表
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="showType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<ModelsEntity> GetModelList(ModelType modelType, ModelShowType showType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取商品模型列表
		/// </summary>
		/// <param name="showType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<ModelsEntity> GetShopModelList(ModelShowType showType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取内容模型列表
		/// </summary>
		/// <param name="showType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<ModelsEntity> GetContentModelList(ModelShowType showType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取自定义表单模型列表
		/// </summary>
		/// <param name="showType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<ModelsEntity> GetCustomFormModelList(ModelShowType showType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		#endregion

		#region 获取验证码字段
		/// <summary>
		/// 获取信息模型中用户前台发表信息是否开启验证码
		/// </summary>
		/// <param name="modelID"></param>
		/// <returns></returns>
		bool GetISEnableVerificationCode(int modelID);
		/// <summary>
		/// 获取验证码字段
		/// </summary>
		/// <returns></returns>
		FieldInfo GetValidateCode();
		#endregion

		#region 得到节点绑定的模型列表：表：Model,NodesModelTemplate
		/// <summary>
		/// 得到节点绑定的模型列表
		/// </summary>
		/// <param name="nodeId"></param>
		/// <param name="enable">是否启用（true：启用；false：禁用；）</param>
		/// <param name="modelTyp">模型类型</param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		DataTable GetModelListByNodeId(int nodeId, bool enable = true, ModelType modelTyp = ModelType.Content, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		#endregion

		#region 添加
		/// <summary>
		/// 添加默认字段:为模型生成默认字段,返回xml片段形式的字符串
		/// </summary>
		/// <returns>xml片段形式的字符串</returns>
		string AddDefaultField();
		/// <summary>
		/// 添加商品默认字段
		/// </summary>
		/// <returns></returns>
		string AddShopDefaultField();
		/// <summary>
		/// 添加模型:从指定的模型模板中生成新模型
		/// </summary>
		/// <param name="modelInfo"></param>
		/// <param name="modelTemplateId">模型模板ID</param>
		/// <returns></returns>
		bool Add(ModelsEntity modelInfo, int modelTemplateId);
		/// <summary>
		/// 添加模型：从指定的模型模板中生成新模型。
		/// 1.如果modelTemplateId为0并且type为ModelType.Content则先添加默认字段
		///   否则直接从指定模型导入字段 (字段以字符串形式存储)
		/// 2.如果检查模型字段信息中有自定义字段FieldLevel != 0,则创建表字段
		/// 3.清除模型缓存
		/// </summary>
		/// <param name="modelInfo"></param>
		/// <param name="modelTemplateId">模型模板ID</param>
		/// <param name="type">模型类型</param>
		/// <returns></returns>
		bool Add(ModelsEntity modelInfo, int modelTemplateId, ModelType type);
		/// <summary>
		/// 为子母表模型添加子表模型
		/// </summary>
		/// <param name="parentInfo"></param>
		void AddParentChild(ModelsEntity parentInfo);
		#endregion

		#region 修改
		/// <summary>
		/// 更新字段到模型表(Models)
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="fieldList"></param>
		/// <returns></returns>
		bool UpdateField(ModelType modelType, string fieldList);
		/// <summary>
		/// 更新字段到模型表(Models)
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="fieldList"></param>
		/// <returns></returns>
		bool UpdateField(int modelId, string fieldList);
		#endregion

		#region 删除
		/// <summary>
		/// 删除模型同时删除相关信息。
		/// 1.检查模型中是否包含有信息数据，如果存在则记录日志，并返回数字1。
		/// 2.如果是商城模型且该模型存在订单，则不允许删除并记录日志，然后返回数字2。
		/// 3.删除模型对应扩展表。
		/// 4.删除关联表数据(NodesModelTemplate，Model，CommonInfo，CommonProduct，ProductData，ProductPrice，Cards,Work、WorkCategorySetting)。
		/// 5.删除模型的模板和标签文件。
		/// 6.清除缓存。
		/// 7.返回值含义：（0：删除成功；1：删除的模型中包含有数据；2：删除模型中存在订单；3：删除模型错误）
		/// </summary>
		/// <param name="modelId"></param>
		int DeleteFull(int modelId);
		/// <summary>
		/// 按模型ID删除相应的内容信息(表：CommonInfo)
		/// </summary>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool DeleteContentByModeID(int modelId);
		/// <summary>
		/// 按模型ID删除自定义表单数据(表：Work)
		/// </summary>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool DeleteCustomFormDataByModelID(int modelId);
		/// <summary>
		/// 删除自定义表单处理页信息(表：WorkCategorySetting)
		/// </summary>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool DeleteWorkCategoryCustomForm(int modelId);
		#endregion

		#region 启用模型、启用收费、启用签收
		/// <summary>
		/// 启用/禁用模型
		/// </summary>
		/// <param name="id">模型ID</param>
		/// <param name="disabled">是否禁用</param>
		/// <returns></returns>
		bool Disable(int id, bool disabled);
		/// <summary>
		/// 设置模型启用收费设置
		/// </summary>
		/// <param name="id">模型ID</param>
		/// <param name="charge">是否启用收费</param>
		/// <returns></returns>
		bool EnableCharge(int id, bool charge);
		/// <summary>
		/// 设置模型启用签收功能
		/// </summary>
		/// <param name="id">模型ID</param>
		/// <param name="signIn">是否启用签收</param>
		/// <returns></returns>
		bool EnableSignIn(int id, bool signIn);
		#endregion

		#region 字段管理

		#region 得到字段列表(xml字符串)
		/// <summary>
		/// 得到字段列表(xml字符串)
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		string GetXmlFieldByModelId(int modelId, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 得到字段列表(xml字符串)
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="disable">是否禁用</param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		string GetXmlFieldByModelId(int modelId, bool disable, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 得到字段列表(xml字符串)
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		string GetXmlFieldByModelType(ModelType modelType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 得到字段列表(xml字符串)
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="disable">是否禁用</param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		string GetXmlFieldByModelType(ModelType modelType, bool disable, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 得到商品模型的常用公共属性字段的XML片段
		/// </summary>
		/// <returns></returns>
		string GetCommonShopXmlFieldList();
		#endregion

		#region 获取模型字段实体类列表
		/// <summary>
		/// 按节点ID获取绑定的第一个模型的字段列表
		/// </summary>
		/// <param name="nodeId"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByNodeId(int nodeId, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取指定模型ID的字段列表
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByModelId(int modelId, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取指定模型ID的字段列表
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="disable">字段是否禁用</param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByModelId(int modelId, bool disable, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取指定模型类型的字段列表
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByModelType(ModelType modelType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取指定模型类型的字段列表
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="disable">字段是否禁用</param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByModelType(ModelType modelType, bool disable, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 得到商品模型的常用公共属性字段列表
		/// </summary>
		/// <returns></returns>
		IList<FieldInfo> GetCommonShopFieldList();
		/// <summary>
		/// 获取模型字段中可用于搜索的所有字段列表
		/// </summary>
		/// <param name="modelType"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<FieldInfo> GetSearchFieldList(ModelType modelType, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 从xml字段信息中获取字段列表
		/// </summary>
		/// <param name="xmlField">字段的XML信息</param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByXmlField(string xmlField);
		/// <summary>
		/// 获取字段信息列表：词典形式(FieldName , FieldInfo)
		/// </summary>
		/// <param name="modelId"></param>
		/// <returns></returns>
		Dictionary<string, FieldInfo> GetFieldDictList(int modelId);
		#endregion

		#region 得到字段信息对象
		/// <summary>
		/// 获取模型字段信息
		/// </summary>
		/// <param name="modeType"></param>
		/// <param name="fieldName"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		FieldInfo GetFieldInfoByFieldName(ModelType modeType, string fieldName, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取模型字段信息
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="fieldName"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		FieldInfo GetFieldInfoByFieldName(int modelId, string fieldName, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 获取商品模型公共属性字段信息
		/// </summary>
		/// <param name="fieldName"></param>
		/// <returns></returns>
		FieldInfo GetShopFieldInfoByFieldName(string fieldName);
		#endregion

		#region 字段是否存在
		/// <summary>
		/// 判断模型中字段是否存在
		/// </summary>
		/// <param name="modeType"></param>
		/// <param name="fieldName"></param>
		/// <returns></returns>
		bool FieldExists(ModelType modeType, string fieldName);
		/// <summary>
		/// 判断模型中字段是否存在
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="fieldName"></param>
		/// <returns></returns>
		bool FieldExists(int modelId, string fieldName);
		/// <summary>
		/// 判断模型中字段是否存在
		/// </summary>
		/// <param name="xmlFieldList">XML形式的字段列表</param>
		/// <param name="fieldName"></param>
		/// <returns></returns>
		bool FieldExists(string xmlFieldList, string fieldName);
		#endregion

		#region 禁用字段、字段是否必填、字段允许搜索、字段排序
		/// <summary>
		///  禁用模型字段
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="disabled"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool SetFieldDisabled(string fieldName, bool disabled, ModelType modelType);
		/// <summary>
		/// 禁用模型字段
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="disabled"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool SetFieldDisabled(string fieldName, bool disabled, int modelId);

		/// <summary>
		///  模型字段必填
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="enable">true:必填；false:可空；</param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool SetFieldEnableNull(string fieldName, bool enable, ModelType modelType);
		/// <summary>
		/// 模型字段必填
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="enable">true:必填；false:可空；</param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool SetFieldEnableNull(string fieldName, bool enable, int modelId);

		/// <summary>
		///  模型字段允许搜索
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="enable">true:允许；false:不允许；</param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool SetFieldEnableSearch(string fieldName, bool enable, ModelType modelType);
		/// <summary>
		/// 模型字段允许搜索
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="enable">true:允许；false:不允许；</param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool SetFieldEnableSearch(string fieldName, bool enable, int modelId);

		/// <summary>
		/// 重设模型字段顺序
		/// </summary>
		/// <param name="fieldInfoList"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool SetOrderId(IList<FieldInfo> fieldInfoList, ModelType modelType);
		/// <summary>
		/// 重设模型字段顺序
		/// </summary>
		/// <param name="fieldInfoList"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool SetOrderId(IList<FieldInfo> fieldInfoList, int modelId);
		/// <summary>
		/// 更新模型字段的顺序
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="modelId"></param>
		/// <param name="orderId">排序号</param>
		/// <returns></returns>
		bool SetOrderId(string fieldName, int modelId, int orderId);
		#endregion

		#region 字段类型、字段别名
		/// <summary>
		/// 获取字段类型名称：单行文本 行政区划 商品款式 商品属性 关键字 多图片
		/// </summary>
		/// <param name="fieldType"></param>
		/// <returns></returns>
		string GetFieldTypeName(int fieldType);
		/// <summary>
		/// 获取字段类型对应的数据类型
		/// </summary>
		/// <param name="fieldtype"></param>
		/// <returns></returns>
		Type GetFieldDataType(FieldType fieldtype);
		/// <summary>
		/// 获取字段别名及字段名数据表（FieldAlias、FieldName）
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="fieldType">要查找的字段类型</param>
		/// <returns></returns>
		DataTable GetFieldNames(int modelId, FieldType[] fieldType);
		#endregion

		#region 添加
		/// <summary>
		/// 将模型字段信息更新到模型表中，并添加字段到模型的对应扩展表中。
		/// 1.从模型表中取出模型字段信息(xml字段字符串),如果未取到则记录log。
		/// 2.判断字段名是否已存在。
		/// 3.如果字段类型为上传文件，并且开启了保存文件大小选项，则添加新字段到字段列表中。
		/// 4.更新XML字段信息到模型表中。
		/// 5.如果fieldInfo.FieldType != FieldType.Property and (fieldInfo.FieldType != FieldType.ProductStyle)将字段添加到扩展表。
		/// 6.清除模型缓存。
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		ResultInfo AddFieldToTable(FieldInfo fieldInfo, ModelType modelType);
		/// <summary>
		/// 将模型字段信息更新到模型表中，并添加字段到模型的对应扩展表中。
		/// 1.从模型表中取出模型字段信息(xml字段字符串),如果未取到则记录log。
		/// 2.判断字段名是否已存在。
		/// 3.如果字段类型为上传文件，并且开启了保存文件大小选项，则添加新字段到字段列表中。
		/// 4.更新XML字段信息到模型表中。
		/// 5.如果fieldInfo.FieldType != FieldType.Property and (fieldInfo.FieldType != FieldType.ProductStyle)将字段添加到扩展表。
		/// 6.清除模型缓存。
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		ResultInfo AddFieldToTable(FieldInfo fieldInfo, int modelId);

		/// <summary>
		/// 添加字段到模型扩展表中：如果添加出错则记录日志
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool AddTableField(FieldInfo fieldInfo, ModelType modelType);
		/// <summary>
		/// 添加字段到模型扩展表中：如果添加出错则记录日志
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool AddTableField(FieldInfo fieldInfo, int modelId);
		#endregion

		#region 修改
		/// <summary>
		/// 更新模型的字段。
		/// 1、更新字段到模型表(Models)。
		/// 2、更新字段到模型对应的扩展表中(只针对自定义字段并且字段类型为单行文本变多行文本的字段)。
		/// 3、删除缓存。
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool UpdateFieldOfTable(FieldInfo fieldInfo, ModelType modelType);
		/// <summary>
		/// 更新模型的字段。
		/// 1、更新字段到模型表(Models)。
		/// 2、更新字段到模型对应的扩展表中(只针对自定义字段并且字段类型为单行文本变多行文本的字段)。
		/// 3、删除缓存。
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool UpdateFieldOfTable(FieldInfo fieldInfo, int modelId);

		/// <summary>
		/// 更新字段到模型扩展表中
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool UpdateTableField(FieldInfo fieldInfo, ModelType modelType);
		/// <summary>
		/// 更新字段到模型扩展表中
		/// </summary>
		/// <param name="fieldInfo"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool UpdateTableField(FieldInfo fieldInfo, int modelId);
		#endregion

		#region 删除
		/// <summary>
		/// 删除指定模型的字段，并删除相关信息。
		/// 1、系统级别（FieldLevel == 0）的字段不能删除。
		/// 2、字段类型为文件时，删除附属字段（保存文件大小的字段）。
		/// 3、更新字段信息到模型表。
		/// 4、删除相关信息(DeleteFieldPermissionFromGroup,DeleteFieldPermissionFromRoles)。
		/// 5、从模型扩展表中删除字段。
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="modelType"></param>
		/// <returns></returns>
		bool DeleteFieldToTable(string fieldName, ModelType modelType);
		/// <summary>
		/// 删除指定模型的字段，并删除相关信息。
		/// 1、系统级别（FieldLevel == 0）的字段不能删除。
		/// 2、字段类型为文件时，删除附属字段（保存文件大小的字段）。
		/// 3、更新字段信息到模型表。
		/// 4、删除相关信息(DeleteFieldPermissionFromGroup,DeleteFieldPermissionFromRoles)。
		/// 5、从模型扩展表中删除字段。
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool DeleteFieldToTable(string fieldName, int modelId);

		/// <summary>
		/// 从指定的模型扩展表中，移除指定字段列，失败则记录日志。
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="tableName"></param>
		/// <returns></returns>
		bool DeleteTableField(string fieldName, string tableName);
		/// <summary>
		/// 从指定模型扩展表中，移除指定行政区域字段列，失败则记录日志。
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="tableName"></param>
		/// <returns></returns>
		bool DeleteTableRegionField(string fieldName, string tableName);
		/// <summary>
		/// 从指定模型扩展表中，移除指定行政区域(5级)字段列，失败则记录日志。
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="tableName"></param>
		/// <returns></returns>
		bool DeleteTableRegionFiveField(string fieldName, string tableName);
		#endregion

		#endregion

		#region 模型模板管理（表：ModelTemplates）
		/// <summary>
		/// 获取指定模板ID的字段列表(xml字符串)
		/// </summary>
		/// <param name="templateId"></param>
		/// <returns></returns>
		string GetXmlFieldByTemplateId(int templateId);
		/// <summary>
		/// 获取指定模板ID的字段列表
		/// </summary>
		/// <param name="templateId"></param>
		/// <returns></returns>
		IList<FieldInfo> GetFieldListByTemplateId(int templateId);
		/// <summary>
		/// 得到模型模板中的字段
		/// </summary>
		/// <param name="templateId"></param>
		/// <param name="fieldName"></param>
		/// <returns></returns>
		FieldInfo GetTemplatesFieldInfoByFieldName(int templateId, string fieldName);
		/// <summary>
		/// 更新模板字段列
		/// </summary>
		/// <param name="templateId"></param>
		/// <param name="fieldList">XML字段列表</param>
		/// <returns></returns>
		bool UpdateTemplatesField(int templateId, string fieldList);
		/// <summary>
		/// 删除模型模板的字段
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="templateId"></param>
		/// <returns></returns>
		bool DeleteTemplatesField(string fieldName, int templateId);
		/// <summary>
		/// 禁用模型模板字段
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="disabled"></param>
		/// <param name="templateId"></param>
		/// <returns></returns>
		bool SetTemplateFieldDisabled(string fieldName, bool disabled, int templateId);

		/// <summary>
		///  模型模板字段必填
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="enable">true:必填；false:可空；</param>
		/// <param name="templateId"></param>
		/// <returns></returns>
		bool SetTemplateFieldEnableNull(string fieldName, bool enable, int templateId);

		/// <summary>
		///  模型模板字段允许搜索
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="enable">true:允许；false:不允许；</param>
		/// <param name="templateId"></param>
		/// <returns></returns>
		bool SetTemplateFieldEnableSearch(string fieldName, bool enable, int templateId);

		/// <summary>
		/// 重设模型模板字段顺序
		/// </summary>
		/// <param name="fieldInfoList"></param>
		/// <param name="templateId"></param>
		/// <returns></returns>
		bool SetTemplateOrderId(IList<FieldInfo> fieldInfoList, int templateId);
		/// <summary>
		/// 更新模型模板字段的顺序
		/// </summary>
		/// <param name="fieldName"></param>
		/// <param name="templateId"></param>
		/// <param name="orderId">排序号</param>
		/// <returns></returns>
		bool SetTemplateOrderId(string fieldName, int templateId, int orderId);
		#endregion

		#region 节点模型模板管理（表：NodesModelTemplate）

		#region 是否存在数据
		/// <summary>
		/// 判断节点模型模板关系记录是否存在（表：NodesModelTemplate）
		/// </summary>
		/// <param name="nodeId"></param>
		/// <param name="modelId"></param>
		/// <returns></returns>
		bool ModelIdExists(int nodeId, int modelId);
		/// <summary>
		/// 判断节点模型模板关系记录是否存在（表：NodesModelTemplate）
		/// </summary>
		/// <param name="info"></param>
		/// <returns></returns>
		bool ExistsNodesModelTemplateRelationShip(NodesModelTemplateEntity info);
		/// <summary>
		/// 判断节点模型模板关系记录是否存在（表：NodesModelTemplate）
		/// </summary>
		/// <param name="nodeId"></param>
		/// <returns></returns>
		bool ExistsNodesModelTemplateRelationShip(int nodeId);
		#endregion

		#region 得到实体类与实体类列表
		/// <summary>
		/// 获取节点模型模板关系列表
		/// </summary>
		/// <param name="nodeId"></param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<NodesModelTemplateEntity> GetNodesModelTemplateList(int nodeId, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		#endregion

		#region 添加、修改、删除
		/// <summary>
		/// 为指定节点添加模型对应的默认模板，删除缓存。
		/// </summary>
		/// <param name="nodeId"></param>
		/// <param name="contentData">表结构：ModelID：模型ID；TemplateFile：默认模板文件路径；</param>
		/// <returns></returns>
		bool AddModelForNodes(int nodeId, DataTable contentData);
		/// <summary>
		/// 添加节点-模型-模板关系，删除缓存。
		/// </summary>
		/// <param name="info"></param>
		/// <returns></returns>
		bool AddNodesModelTemplateRelationShip(NodesModelTemplateEntity info);
		/// <summary>
		/// 批量更新节点模型模板关系
		/// </summary>
		/// <param name="nodeId"></param>
		/// <param name="infoList"></param>
		/// <returns></returns>
		bool UpdateNodesModelTemplateRelationShip(int nodeId, IList<NodesModelTemplateEntity> infoList);
		/// <summary>
		/// 删除节点-模型-模板关系(表：NodesModelTemplate)
		/// </summary>
		/// <param name="nodeId"></param>
		/// <returns></returns>
		bool DeleteNodesModelTemplateRelationShip(int nodeId);
		#endregion

		#endregion

		#region 为模型生成模板文件和内容页标签文件
		/// <summary>
		/// 为模型生成内容页标签文件（XSLT文件）。
		/// 保存目录：网站根目录//模板库目录/标签目录/模型名称
		/// </summary>
		/// <param name="modelId"></param>
		void CreateIncludeField(int modelId);
		/// <summary>
		/// 为模型生成通用内容列表页模板:保存在:网站根目录/CommonTemplate/templateName/modelInfo.ModelName_templateName目录下。
		/// 内容为：《tr》《td》{JX.Field id=\"cone\" fieldname=\"" + info.FieldName + "\" /}《/td》《/tr》
		/// </summary>
		/// <param name="modelId"></param>
		/// <param name="templateName"></param>
		void CreateIncludeModel(int modelId, string templateName);
		#endregion

		#region 其他
		/// <summary>
		/// 在指定表中查找指定字段的值列表，如果表名为“CommonInfo”，需要指定modelId
		/// </summary>
		/// <param name="tableName">模型表名</param>
		/// <param name="fieldName">模型字段名</param>
		/// <param name="modelId">模型ID</param>
		/// <param name="writeAndRead"></param>
		/// <returns></returns>
		IList<string> GetLookupField(string tableName, string fieldName, int modelId, WriteAndReadEnum writeAndRead = WriteAndReadEnum.None);
		/// <summary>
		/// 得到已启用的、模型类型为内容模型的ModelID集合。多个ID用“,”分割
		/// </summary>
		/// <returns></returns>
		string GetCacheContentModelIdList();
		/// <summary>
		/// 获取启用的商品模型所对应绑定的第一个节点ID。返回值格式：(模型ID,节点ID)
		/// </summary>
		/// <returns></returns>
		string GetNodeIdModelIdByShopModelType();
		#endregion
	}
}